/**
 * 根据提供的URL请求图片资源
 *
 * @param url 图片资源的URL
 * @returns 返回一个Promise对象，加载成功时resolve图片对象，加载失败时reject URL
 */
function request_image(url: string) {
  return new Promise((resolve, reject) => {
    const img = new Image()
    img.onload = function () {
      resolve(img)
    }
    img.onerror = function () {
      reject(url)
    }
    img.src = `${url}?random-no-cache=${Math.floor(
      (1 + Math.random()) * 0x10000,
    ).toString(16)}`
  })
}

/**
 * 向指定 URL 发送 ping 请求，并返回延迟时间。
 *
 * @param url 要 ping 的 URL 地址。
 * @param multiplier 时间延迟的倍数，默认为 1。
 * @param timeout 请求超时时间，单位为毫秒，默认为 5000 毫秒。
 * @returns 返回一个 Promise，成功时解析为延迟时间（以毫秒为单位），失败时抛出错误。
 */
export function pingImage(url: string, multiplier = 1, timeout = 5000) {
  return new Promise<number>((resolve, reject) => {
    const start = new Date().getTime()
    const response = function () {
      let delta = new Date().getTime() - start
      delta *= multiplier
      resolve(delta)
    }
    request_image(url).then(response).catch(response)
    setTimeout(() => {
      reject(new Error('Timeout'))
    }, 5000)
  })
}
